#ifndef IMGDIVISION_H
#define IMGDIVISION_H

#include <QImage>
#include <QDebug>
#include <vector>
#include <math.h>
#include <stack>
#include <queue>
#include<algorithm>

using namespace std;

class ImgDivision
{
public:
    ImgDivision(QImage *img);

    QImage* byThreshold(int threshold);//普通阈值二值化
    QImage* byThreshold_Otsu();//Otsu阈值
    QImage* byParallelEdge(double threshold, QString method);//并行分割
    QImage* byRegionGrow(vector<int> seeds, double threshold, int fourOrEight);//区域增长算法
    QImage* bySLIC();//超像素分割

    //基于阈值
    void getGrayLevel();//获取灰度级结果
    double getInterclassVariance(int first_threshold);//获取类间方差 Ostu
    //基于并行边缘算子
    void getGradientValue();//获取梯度值
    //区域增长的方法
    void getRegionGrowResult(double threshold, int fourOrEight);//获取 区域增长结果 较好 空白模板比对查重较快
    double getPixelAvg(int x, int y);//获取对应位置处像素的均值  xy若超出范围 返回-1
    //太慢 未采取
    //void getRegionGrowRes(double threshold);//获取 区域增长结果 有问题 太慢了 每次遍历种子群来查找重复太慢
    //bool isAddVal(int x, int y);//判断是否重复添加
    //超像素+分水岭算法
    vector<double> getImgComplexity();//计算图像复杂度、信息熵
    vector<vector<double>> getGLCM(int angle);//计算共生矩阵
    vector<double> getGLCMfeatures(int angle);//计算共生矩阵特征值
    vector<vector<vector<double>>> getLab();//获取Lab图像
    //两点  lab表  超像素个数  颜色空间比重衡量m
    double getDistance(QPoint p1, QPoint p2, vector<vector<vector<double>>> lab, double P, double m);//距离度量函数

private:
    QImage *m_Img;
public:
    int m_GrayLevel[256];//存 灰度级结果
    int m_BestThreshold = 0;//Otsu最优阈值
    //并行边缘分割算子
    vector<vector<double>> m_Grad_Roberts;//Roberts算子计算的梯度
    vector<vector<double>> m_Grad_Prewitt;//Prewitt算子计算的梯度
    vector<vector<double>> m_Grad_Sobel;//Sobel算子计算的梯度
    vector<vector<double>> m_Grad_Laplacian4;//Laplacian 4邻域算子计算的梯度
    vector<vector<double>> m_Grad_Laplacian8;//Laplacian 8邻域算子计算的梯度

    //区域生长 参数
    vector<int> m_Seeds = {0, 0};//种子点 初始0 0左上角点
    queue<vector<int>> m_RegionGet;//获取的所有种子点 即最终获得的区域
};

#endif // IMGDIVISION_H
